from card import Card
from user import User
import random
import os
import pickle


class Bank(object):
    def __init__(self):
        pass
        self.users = []  # 当前银行的所有用户
        self.file_path = 'user.txt'  # 本地文件路径
        # 启动银行系统后,将所有的用户信息读取出来
        self.__get_users()
        print("=>千锋银行所有的用户资料", self.users)

    # 存储用户信息
    def __save_user(self):
        # 写入文件
        fp = open(self.file_path, 'wb')
        # 通过pickl.dump的方式写入文件中
        pickle.dump(self.users, fp)
        fp.close()
        print("=>当前所有的用户:", self.users)

    # 每次运行银行项目都去读取所有的用户信息
    def __get_users(self):
        if os.path.exists(self.file_path):
            fp = open(self.file_path, 'rb')
            self.users = pickle.load(fp)
            fp.close()

    # 开户功能
    def create_user(self):
        '''
            1.办卡:卡号  设置卡的密码  向卡中存钱
            2.绑定用户信息: 真实姓名 身份证号  手机号码
        '''
        # 卡号: 通过私有方法创建一个卡号
        cardId = self.__create_cardId()
        print("=>成功创建卡号:", cardId)
        # 设置银行卡密码:
        password = self.__set_password()
        if not password:
            return
        # 向银行卡中至少存入20元
        money = float(input("请输入要预存的金额:"))
        # 创建银行卡对象
        card = Card(cardId, password, money)
        print("=>办卡成功:", card)

        # 创建用户
        name = input("请输入您的真实姓名:")
        idcard = input("请输入您的身份证号:")
        phone = input("请输入您的手机号码:")
        user = User(name, phone, idcard, card)
        print("创建用户成功", user)

        # 3.将新用户进行存储
        # 将新用户存储到文件中
        self.users.append(user)  # 将新创建的用户追加到self.users列表中去
        # 存储用户到本地文件
        self.__save_user()

    # 随机生成一个唯一的银行卡号
    def __create_cardId(self):
        while True:
            # 生成随机的卡号:
            cardId = "8888"
            for i in range(4):
                cardId += str(random.randint(0, 9))

            return cardId

    # 设置银行卡密码:
    def __set_password(self):
        # 输入密码有3次机会
        for i in range(3):
            password = input("请输入密码:")
            repassword = input("请再次输入密码:")
            # 验证两次输入的密码是否一致
            if password == repassword:
                return password
            print("=>两次输入的密码不一致,请重新输入!")
        else:
            print("=>3次机会已使用完毕,请明天再来办理业务!")
            return False

    # "**************      华丽的分割线        ***************")
    # 2.查询的功能
    def search(self):
        '''
            a.输入卡号
            b.输入密码
            c.显示余额
        '''
        # 输入卡号
        user = self.__input_cardid()
        if not user:
            print("=>查询不到您输入的卡号!")
            return
        # 输入密码:
        password = input("请输入银行卡密码:")
        if user.card.password != password:
            print("=>密码错误!您总共有3次机会,超过3次会锁卡!")
            return
        # 显示余额
        print("当前余额为:", user.card.money)

    # 输入卡号
    def __input_cardid(self):
        cardid = input("请输入银行卡号")
        # 如果卡号存在,则返回用户对象,否则返回None
        for user in self.users:
            if user.card.cardId == cardid:
                return user
